package com.analysis.mapper;

import com.analysis.entity.References;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 信源Mapper接口
 */
@Mapper
public interface ReferencesMapper {
    
    /**
     * 插入信源
     */
    int insert(References references);
    
    /**
     * 根据ID删除信源（物理删除）
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 根据ID逻辑删除信源（设置enable_status=0）
     */
    int logicalDeleteById(@Param("id") Long id);
    
    /**
     * 更新信源信息
     */
    int update(References references);
    
    /**
     * 根据ID查询信源
     */
    References selectById(@Param("id") Long id);
    
    /**
     * 根据URL查询信源
     */
    References selectByUrl(@Param("url") String url);
    
    /**
     * 根据项目ID查询信源列表
     */
    List<References> selectByProjectId(@Param("projectId") Long projectId);
    
    /**
     * 根据品牌名称查询信源列表
     */
    List<References> selectByProductName(@Param("productName") String productName);
    
    /**
     * 根据AI模型查询信源列表
     */
    List<References> selectByAiModel(@Param("aiModel") String aiModel);
    
    /**
     * 根据网站类型查询信源列表
     */
    List<References> selectByWebType(@Param("webType") String webType);
    
    /**
     * 查询所有信源
     */
    List<References> selectAll();
    
    /**
     * 分页查询信源
     */
    List<References> selectByPage(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 统计信源总数
     */
    int countAll();
    
    /**
     * 根据条件查询信源
     */
    List<References> selectByCondition(@Param("projectId") Long projectId,
                                      @Param("productName") String productName,
                                      @Param("aiModel") String aiModel,
                                      @Param("webType") String webType,
                                      @Param("enableStatus") Integer enableStatus);
    
    /**
     * 根据品牌名称和问题查询信源
     */
    List<References> selectByProductAndQuestion(@Param("productName") String productName,
                                               @Param("question") String question);
    
    /**
     * 根据品牌名称和URL查询信源
     */
    List<References> selectByProductAndUrl(@Param("productName") String productName,
                                          @Param("url") String url);
    
    /**
     * 多条件分页查询信源
     */
    List<References> selectByPageWithConditions(@Param("productName") String productName,
                                               @Param("question") String question,
                                               @Param("aiModel") String aiModel,
                                               @Param("projectId") Long projectId,
                                               @Param("webName") String webName,
                                               @Param("pageName") String pageName,
                                               @Param("url") String url,
                                               @Param("addType") Integer addType,
                                               @Param("webType") Integer webType,
                                               @Param("offset") int offset,
                                               @Param("limit") int limit);
    
    /**
     * 多条件统计信源总数
     */
    long countByPageWithConditions(@Param("productName") String productName,
                                  @Param("question") String question,
                                  @Param("aiModel") String aiModel,
                                  @Param("projectId") Long projectId,
                                  @Param("webName") String webName,
                                  @Param("pageName") String pageName,
                                  @Param("url") String url,
                                  @Param("addType") Integer addType,
                                  @Param("webType") Integer webType);
    
    /**
     * 查询web_type为null的信源
     */
    List<References> selectByNullWebType();
    
    /**
     * 根据条件查询web_type为null的信源
     */
    List<References> selectByNullWebTypeWithConditions(@Param("ids") List<Long> ids,
                                                      @Param("productName") String productName,
                                                      @Param("projectId") Long projectId,
                                                      @Param("aiModel") String aiModel);
    
    /**
     * 批量更新web_type
     */
    int batchUpdateWebType(@Param("id") Long id, @Param("webType") Integer webType);
    
    /**
     * 批量更新web_type（使用IN语句）
     */
    int batchUpdateWebTypeByIds(@Param("ids") List<Long> ids, @Param("webType") Integer webType);
    
    /**
     * 统计指定web_type的数量
     */
    int countByWebType(@Param("webType") Integer webType);
    
    /**
     * 根据条件统计指定web_type的数量
     */
    int countByWebTypeWithConditions(@Param("webType") Integer webType,
                                    @Param("ids") List<Long> ids,
                                    @Param("productName") String productName,
                                    @Param("projectId") Long projectId,
                                    @Param("aiModel") String aiModel);
    
    /**
     * 检查URL和产品名称是否已存在（用于去重）
     */
    int countByUrlAndProductName(@Param("url") String url, @Param("productName") String productName);
    
    /**
     * 批量检查URL和产品名称是否已存在
     */
    List<String> checkDuplicatesByUrlAndProductName(@Param("urls") List<String> urls, @Param("productNames") List<String> productNames);

    /**
     * 根据URL列表批量查询信源
     */
    List<References> selectByUrls(@Param("urls") List<String> urls);

    /**
     * 批量更新信源
     */
    int batchUpdateReferences(@Param("list") List<References> referencesList);
}
